nodeNameResolver = $nodeNameResolver; } /** * @param MappingClass::* $attributeClass * @param \PhpParser\Node\Stmt\ClassMethod|\PhpParser\Node\Stmt\Property|\PhpParser\Node\Stmt\ClassLike|\PhpParser\Node\Param $node */ public function findAttributeByClassArgByName($node, string $attributeClass, string $argName) : ?Expr { return $this->findAttributeByClassesArgByName($node, [$attributeClass], $argName); } /** * @param string[] $attributeClasses * @param string[] $argNames * @param \PhpParser\Node\Stmt\ClassMethod|\PhpParser\Node\Stmt\Property|\PhpParser\Node\Stmt\ClassLike|\PhpParser\Node\Param $node */ public function findAttributeByClassesArgByNames($node, array $attributeClasses, array $argNames) : ?Expr { $attribute = $this->findAttributeByClasses($node, $attributeClasses); if (!$attribute instanceof Attribute) { return null; } foreach ($argNames as $argName) { $argExpr = $this->findArgByName($attribute, $argName); if ($argExpr instanceof Expr) { return $argExpr; } } return null; } /** * @param string[] $attributeClasses * @param \PhpParser\Node\Stmt\ClassMethod|\PhpParser\Node\Stmt\Property|\PhpParser\Node\Stmt\ClassLike|\PhpParser\Node\Param $node */ public function findAttributeByClassesArgByName($node, array $attributeClasses, string $argName) : ?Expr { $attribute = $this->findAttributeByClasses($node, $attributeClasses); if (!$attribute instanceof Attribute) { return null; } return $this->findArgByName($attribute, $argName); } /** * @param \PhpParser\Node\Stmt\ClassMethod|\PhpParser\Node\Stmt\Property|\PhpParser\Node\Stmt\ClassLike|\PhpParser\Node\Param $node */ public function findAttributeByClass($node, string $attributeClass) : ?Attribute { /** @var AttributeGroup $attrGroup */ foreach ($node->attrGroups as $attrGroup) { foreach ($attrGroup->attrs as $attribute) { if (!$attribute->name instanceof FullyQualified) { continue; } if ($this->nodeNameResolver->isName($attribute->name, $attributeClass)) { return $attribute; } } } return null; } /** * @param string[] $attributeClasses * @param \PhpParser\Node\Stmt\ClassMethod|\PhpParser\Node\Stmt\Property|\PhpParser\Node\Stmt\ClassLike|\PhpParser\Node\Param $node */ public function findAttributeByClasses($node, array $attributeClasses) : ?Attribute { foreach ($attributeClasses as $attributeClass) { $attribute = $this->findAttributeByClass($node, $attributeClass); if ($attribute instanceof Attribute) { return $attribute; } } return null; } /** * @param string[] $attributeClasses * @param \PhpParser\Node\Stmt\ClassMethod|\PhpParser\Node\Stmt\Property|\PhpParser\Node\Stmt\ClassLike|\PhpParser\Node\Param $node */ public function hasAttributeByClasses($node, array $attributeClasses) : bool { return $this->findAttributeByClasses($node, $attributeClasses) !== []; } private function findArgByName(Attribute $attribute, string $argName) : ?\PhpParser\Node\Expr { foreach ($attribute->args as $arg) { if (!$arg->name instanceof Identifier) { continue; } if (!$this->nodeNameResolver->isName($arg->name, $argName)) { continue; } return $arg->value; } return null; } }